package com.ustb.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 启动外部进程Python脚本并读取其输出
 */
public class ProcessBuilderExample {
    public static void main(String[] args) {
        try {
            // 创建一个ProcessBuilder对象，用于启动外部进程
            // 启动的外部进程是执行 "python" 命令，并传入 "my_script.py" 作为参数
            //后续添加要运行的py文件，现在的my_script.py是示例
            ProcessBuilder processBuilder = new ProcessBuilder("python", "my_script.py");

            // 使用ProcessBuilder启动外部进程，返回一个表示该进程的Process对象
            Process process = processBuilder.start();

            // 创建一个BufferedReader对象，用于读取外部进程的标准输出流（getInputStream() 获取的是标准输出流）。
            // 先将外部进程的标准输出流转换为InputStreamReader，再包装成BufferedReader以便于按行读取数据。
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

            // 定义一个字符串变量line，用于存储从外部进程标准输出流中读取到的每一行数据。
            String line;

            /*进入一个循环，只要能从BufferedReader中读取到一行数据（即readLine() 返回的值不为null），
              就将该行数据输出到控制台（System.out.println(line)），
              这个循环会持续读取外部进程的标准输出流中的每一行数据并打印出来，直到没有更多数据可读。*/
            while ((line = reader.readLine())!= null) {
                System.out.println(line);
            }

            // 等待外部进程执行完毕，并获取该进程的退出码。
            // 程序会在此处阻塞，直到外部进程结束运行，然后返回外部进程的退出码。
            int exitCode = process.waitFor();

            // 将外部进程的退出码输出到控制台，以便了解外部进程（即执行的Python脚本）执行完毕后的状态。
            System.out.println("退出码: " + exitCode);
        } catch (IOException | InterruptedException e) {
            //出现异常
            e.printStackTrace();
        }
    }
}